//package com.bourne.annotation.aspect;
//
//import com.bourne.annotation.Dict;
//import com.bourne.annotation.DictScan;
//import com.bourne.component.DictDBStragety;
//import com.bourne.component.DictRedisStrategy;
//import com.bourne.constant.NumConstant;
//import com.bourne.constant.StringConstant;
//import com.bourne.util.ClassUtil;
//import com.bourne.util.JsonData;
//import com.bourne.vo.DictVO;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import org.springframework.util.ObjectUtils;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.Method;
//import java.util.Map;
//
///**
// * @author bourne
// * @Title: DictAspect
// * @Description:
// * @date 2021/12/2415:27
// */
//@Aspect
//@Component
//@Slf4j
//public class DictScanAspect {
//
//    @Autowired
//    private ClassUtil classUtil;
//
//    @Autowired
//    private DictRedisStrategy dictRedisStrategy;
//
//    @Autowired
//    private DictDBStragety dictDBStragety;
//
//    @Value("${cache.dict:false}")
//    private boolean dictCache;
//
//    @Around("@annotation(dictScan)")
//    public Object running (ProceedingJoinPoint pjp, DictScan dictScan) throws Throwable {
//        Object obj = pjp.proceed();
//        boolean required = dictScan.required();
//
//        if (obj instanceof JsonData && required) {
//            JsonData result = (JsonData)obj;
//            Object data = result.getData();
//            if (data == null) {
//                return obj;
//            }
//
//            Field[] declaredFields = data.getClass().getDeclaredFields();
//            if (declaredFields.length <= NumConstant.ZERO) {
//                return obj;
//            }
//
//            for (Field field : declaredFields) {
//                if (field.isAnnotationPresent(Dict.class)) {
//                    String name = field.getName();
//                    Method method = data.getClass().getMethod(StringConstant.VALUE_GET + classUtil.uppercase(name));
//                    Object invoke = method.invoke(data);
//                    if (invoke == null) {
//                        continue;
//                    }
//
//                    Dict declaredAnnotation = field.getDeclaredAnnotation(Dict.class);
//                    String key = declaredAnnotation.key();
//
//                    Object value = "";
//                    DictVO dictVO = DictVO.builder().dictKey(key).dictField(invoke.toString()).build();
//                    if (dictCache) {
//                        // 从缓存钟获取数据
//                        value = dictRedisStrategy.getDictData(dictVO);
//                    }
//                    if (value == null || value == "") {
//                        // 从DB中获取数据
//                        value = dictDBStragety.getDictData(dictVO);
//                        if (dictCache && !ObjectUtils.isEmpty(value)) {
//                            // 如果开启了缓存并且从数据中获取到了数据 则更新缓存
//                            dictVO.setDictFieldValue(value.toString());
//                            dictRedisStrategy.saveDictData(dictVO);
//                        }
//                    }
//
//                    if (value != null && value != "") {
//                        Map<String, Object> translateMap = result.getTranslate();
//                        translateMap.put(name, value);
//                    }
//                }
//            }
//        }
//        return obj;
//    }
//
//}
